Dokumentation der Praktikumsaufgabe "prove"

Das Programm wurde unter SUSE Linux SWI Prolog geschrieben.
In der Prolog Datei "prove.pl" sind zwei Beweisklauseln realisiert prove 
und prove1, prove arbeitet mit der Klauselform(Konjunktive Normalform), 
prove1 arbeitet mit der dualen Klauselform(Disjunktive Normalform). Nur 
die Ausgangsformeln fr die Resulution sind  unterschiedlich, die 
Resulution ist dieselbe.
Bei der Erstellung des Programms hab ich darauf geachtet das die 
Normalform mglichst kurz ist(rausschneiden von Konstanten, doppelten 
Vorkommen), da die Zeit die die Resulution braucht um die Formel zu 
beweisen exponential mit der Zeit zunimmt.
Es wurden viele Cuts zur Optimierung Gesetz, um das Programm schnell zu 
machen.

Wieso funktioniert Resulution sowohl mit Konjunktiver als auch mit 
Disjunktiver Normalform?

Die Resulution beruht auf der Formel: 
	(a or F1)and(neg(a)or F2)= (a or F1)and(neg(a) or F2)and(F1 or F2)
Beweis:
a	F1	F2	(a or F1)and(neg(a)or F2)	(a or F1)and(neg(a) or F2)and(F1 or F2)
0	0	0		0							0
0	0	1		0							0
0	1	0		1							1
0	1	1		1							1
1	0	0		0							0
1	0	1		1							1
1	1	0		0							0
1	1	1		1							1

Wenn die leere Klausel entsteht war die Ursprungsresulution a and neg(a), 
diese Formel ist unerfllbar und damit wird die gesamte Konjunktive 
Normalform unerfllbar.

Fr die Disjunktive Formel gilt die Formel: 
	(a and F1)or(neg(a) and F2)= (a and F1)or(neg(a) and F2)or(F1 and F2)
Beweis:
a	F1	F2	(a and F1)or(neg(a) and F2)	(a and F1)or(neg(a) and F2)or(F1 and F2)
0	0	0		0						0
0	0	1		1						1
0	1	0		0						0
0	1	1		1						1
1	0	0		0						0
1	0	1		0						0
1	1	0		1						1
1	1	1		1						1

Wenn die leere Klausel entsteht war die Ursprungsresulution (a or neg(a)), 
diese Formel ist allgemeingltig und damit wird die gesammte 
Disjunktive Normalform allgemeingltig.

Wenn das Resulutionsverfahren bei der Erzeugung der leeren Klausel 
false(bzw. fail) ausgibt, ist die Disjunktive Normalform allgemeingltig 
und die Konjunktive Normalform unerfllbar. Dieses Ergebnis wird negiert 
und man erhlt das richtige Ergebnis.
(Nicht von den ganzen Negationen stren lassen)

Also Eingabe: prove(P,F) 			bzw. prove1(P',F')
			-> P->F=neg(P)or F=(neg(neg(F) and P))

Bearbeitet wird die Formel: (neg(F)and P)			(neg(F') and P')
leere Klausel gefunden	Ausgabe resulution(X) fail
		(neg(F) and P) unerfllbar			(neg(F') and P') allgemeingltig	
		(neg(neg(F)and P)) allgemeingltig		(neg(neg(F') and P')) unerfllbar

Vorteile bei den zwei Beweisklauseln

Die Resulution ist mit der Klauselform(Konjunktive Normalform) zum 
schnellen Beweisen geeignet, da dann eine leere Klausel gefunden wird 
und nicht alle Terme, auf die Mglichkeit Resulutionen bilden zu knnen, 
berprft werden mssen.
Andersrum bei der Disjunktiven Normalform. Die Resulution ist mit der 
dualen Klauselform zum schnellen Zeigen der Unerfllbarkeit geeignet, da 
dann eine leere Klausel gefunden wird und nicht alle Terme, auf die 
Mglichkeit Resulutionen bilden zu knnen, berprft werden mssen.
Leider konnte ich dies nicht Testen, da alle Formeln viel zu schnell 
abgearbeitet wurden um die Zeit zu messen(selbst auf meinen langsamen 
Linux Rechner).


Hinweise fr die Graphen:

Der Datenverlaufsgraph von duale Klauselform ist hnlich
(wird hier deshalb nicht aufgefhrt) nur das "and" und "or", 
Disjunktion und Konjunktion vertauscht sind und die "1" am Ende von den 
Namen fehlt. 


Die Klauseln entfDoppelteVorkommen(+X,-Y) und entfKonstanten(+X,-Y) 
dienen nur zur Optimierung(Verkrzung) der ausgangsformel fr die Resulution.

Die Klauseln fuegeListeZusammen(X,Z), eleminateAnd1([B],C) und 
eleminateOrL1(C,D) dienen zur Vernderung der Form.
